package com.learngit;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

public class Experiment_1 {
    
    /* 这是我在gitee上面添加的一行注释，测试git pull命令  */

    public static void main(String[] args) {
	    //计算最大的数组列表
        Integer maxNum = 20000;

        /*********************计算改进前运行时间*************************/
        long startTime_N=System.nanoTime();
        /*测试程序部分*/
        PrimeNumberMaker(maxNum);
        long endTime_N=System.nanoTime(); //获取结束时间
        long timeOld = endTime_N-startTime_N;
        /*********************计算改进后运行时间率*************************/
        startTime_N=System.nanoTime();
        /*测试程序部分*/
        QuickerPrimeNumberMaker(maxNum);
        endTime_N=System.nanoTime(); //获取结束时间
        long timeNew = endTime_N-startTime_N;


        System.out.println("改进前程序运行时间： "+timeOld+"ns");
        System.out.println("改进后程序运行时间： "+timeNew+"ns");


        //计算最大的数组集合
        LinkedList<Integer> array = new LinkedList<>();
        // int[] arrayNum = {1, -2, 3, 5, -1};
        array.add(-1);
        array.add(-2);
        array.add(3);
        array.add(5);
        array.add(-1);
        System.out.println("最大子数组为:");
        System.out.println(CountMaxArray(array));
    }

    //计算最大的数组集合
    private static Integer CountMaxArray(LinkedList<Integer> array){
        Integer arrayLen = array.size();
        Integer maxArray = array.get(0);
        Integer tempSum;
        for(int start = 0;start < arrayLen;start++){
            for(int end = start;end < arrayLen;end++){
                tempSum = ArraySum(array,start,end);
                if( tempSum > maxArray ){
                    maxArray = tempSum;
                }
            }
        }
        return maxArray;
    }

    //计算素数列表
    private static void PrimeNumberMaker(Integer num){
        List<Integer> primeNumberList = new LinkedList<>();
        // 返回小于num的全部素数
        for(int i=2;i<=num;i++){
            boolean flag = false;
            primeNumberList.add(i);
            for(int temp=i-1;temp>1;temp--){
                if(i%temp == 0){
                    flag = true;
                }
            }
            if(flag){
                primeNumberList.remove(primeNumberList.size()-1);
            }
        }
        // 输出
        PrintPrimeNumber(primeNumberList);
    }

    //改进计算素数列表
    private static void QuickerPrimeNumberMaker(Integer num){
        List<Integer> primeNumberList = new LinkedList<>();
        // 返回小于num的全部素数
        for(int i=2;i<=num;i++){
            primeNumberList.add(i);
            int begin = (int)Math.sqrt(i);
            for(int temp=begin;temp>1;temp--){
                if(i%temp == 0){
                    primeNumberList.remove(primeNumberList.size()-1);
                    break;
                }
            }
        }
        // 输出
        PrintPrimeNumber(primeNumberList);
    }

    //辅助函数
    //数组求和
    private static Integer ArraySum(LinkedList<Integer> array,Integer start,Integer end){
        Integer sum = 0;
        for(int i = start;i <= end;i++){
            sum += array.get(i);
        }
        return sum;
    }

    // 输出素数的函数
    private static void PrintPrimeNumber(List<Integer> primeNumberList){
        System.out.println("共素数:" + primeNumberList.size() + "个:");
        Integer index = 1;
        for(Integer tmep:primeNumberList){
            System.out.print(tmep + "\t");
            if(index % 5 == 0){
                System.out.println("");
            }
            index++;
        }
        System.out.println("");
    }
}
